235. Grafana Alert Template

Why

新服務要上線了,
要趕緊把 Observability做一做,
之前的版本都會有一長串資訊,
看了就很煩,不能很直觀的知道是哪邊出問題。
訊息又都要一個一個打,
所以,我能不能弄成一個範本,減少我人工的作業?

Solution

注意,因有特殊符號,導致編譯出問題。
故將裡面的所有{ } 改為全形,請自行改為半形
故將裡面的所有{ } 改為全形,請自行改為半形
故將裡面的所有{ } 改為全形,請自行改為半形

很重要,說三次

原始的範本,通常長成這樣。
有很多資訊,但有些是用不到的。

[FIRING:1] (cpu-dealer GKE Cluster normal backend)

Firing  

Value: B=2.632  
Labels:  
- alertname = cpu-abc  
- grafana_folder = GKE Cluster  
- level = normal  
- service-type = backend  
Annotations:  
- summary = 環境:Prod  
機器名稱:dealer  
告警訊息:CPU使用量1core  
Source: http://localhost:3000/alerting/grafana/uRU7sCEnz/view?orgId=1  
Silence: http://localhost:3000/alerting/silence/new?alertmanager=grafana&matcher=alertname%3Dcpu-dealer&matcher=grafana_folder%3DGKE+Cluster&matcher=level%3Dnormal&matcher=service-type%3Dbackend  
Dashboard: http://localhost:3000/d/2-jy90-nk?orgId=1  
Panel: http://localhost:3000/d/2-jy90-nk?orgId=1&viewPanel=13

最後的成果

[FIRING:1] sftp-qa Disk Space alarm-GCE (normal sftp-qa value_percent_used_mean_aggregate)


Annotations:  
- summary: 環境:alarm-GCE  
機器名稱:sftp-qa  
告警項目:sftp-qa Disk Space  
告警訊息:硬碟空間目前 46.22% ,已達上限 70%  
Dashboard URL:  

[View Dashboard](http://<ip>/grafana/d/f649857c-4763-442f-9919-b41c3832d5b8?orgId=1)

Step 1. 確認版本

首先確認Grafana的版本,目前我使用的是Grafana v11.2.0
版本不一樣,指令可能會不一樣,需要再去查文件。

Step 2. 設定Notification Template

235-fig.1.png

開啟 Home > Alerting > Cotact points
切換到分頁 Notification Templates ,選擇 Add Notification Template

235-fig.2.png

在左上的Template框框,輸入下面程式碼。
如果指令沒錯,可以在右邊的preview看到結果。

{{ define "alert_message" }}
  {{ range .Alerts }}
    {{ if gt (len .Annotations) 0 }}
      Annotations:
      {{ range $key, $value := .Annotations }}
        - **{{ $key }}**:   
        {{ $value }}
      {{ end }}
    {{ else }}
      No Annotations found.
    {{ end }}

    Dashboard URL:
    [View Dashboard]({{ .DashboardURL }})
  {{ end }}
{{ end }}

這程式我是叫GPT寫的,再稍微小改一下。
如果想自己開發,請參考Configure notification messages

p.s. 注意版本,版本不一樣從網頁的版本號調整

Step 3. 綁定notification policy

235-fig.4.png

回到Contact Points,
選擇你的notification policy

235-fig.3.png
選擇剛剛新增的Template

可以按一下Test驗證一下有沒有通。

Step 4. 設定 Alert Rules

基本的設定就參考Alert rules

在Summary則是輸入

環境:{{ index $labels "grafana_folder" }}
機器名稱:{{ index $labels "metadata.label.system.name" }}
告警項目:{{ index $labels "alertname" }}
告警訊息:硬碟空間目前 {{ humanize (index $values "B").Value  }}% ,已達閥值 70%

index是用來顯示標籤中的內容,
可以更方便得到你想要的數值。
可以在測試時用 {{ $labels }} 看有哪些標籤可用。

p.s 版本不一樣,取值的方式也不一樣。

同樣可以使用的是 {{ $value }} ,這邊注意只有value沒有s。
但在使用index時,需要加上 s。

ref. Notification.Templates


humanize 是比較人性化的format函數。

humanize 會將多餘的小數點位數移除或改為比較易讀的方式。
humanizePercentage 將小數點轉為百分比
humanizeDuration 將時間轉為可讀的時間

更多可參考下面連結,裡面也有其他function的用法。
ref. humanize


Troubleshooting

當有一個變數寫錯時,發送告警時,全部的變數都不會顯示。
會變成下面的情況。

- summary:  
{{ $value }}  
環境:{{ index $labels "grafana_folder" }}  
機器名稱:{{ (index $values "B").persistentvolumeclaim }}  
告警項目:{{ index $labels "alertname" }}  
告警訊息:硬碟空間目前 {{ humanizePercentage (index $values "B").Value }} ,已達閥值 70%  

此時就看一下是不是那邊要加空格沒空格,
或是指定的values的欄位有錯誤。
像上面的錯誤,機器名稱的部分應該要改成這樣。
機器名稱:{{ (index $values "B").Labels.persistentvolumeclaim }}